package com.yc.thread.single;

public class LazySingle {

    private LazySingle() {
        System.out.println(Thread.currentThread().getName() + "..");
    }
    private static LazySingle lazySingle;

    private volatile static LazySingle lazySingle1;

    public static LazySingle getInstance() {
        if (lazySingle == null) {
            lazySingle = new LazySingle();
        }
        return lazySingle;
    }

    public static LazySingle getInstanceDoubleCheck() {
        if (lazySingle1 == null) {
            synchronized (LazySingle.class) {
                if (lazySingle1 == null) {
                    // 非线程安全。不是原子操作
                    // 1.分配内存空间、2.执行构造函数、3.把对象指向这个空间
                    lazySingle1 = new LazySingle();
                }
            }

        }
        return lazySingle1;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                LazySingle.getInstance();
            }).start();
        }
    }

}
